import Vue from "vue";
import router from "./router/index";
import store from "./store";
import { ACCESS_TOKEN } from "@/store/mutation-types";
import VueRouter from "vue-router";

// 登录地址
const loginPath = "/userLoginReg/login";

// 白名单
const whiteList = [
  "/userLoginReg/login",
  "/userLoginReg/lock",
  "/userLoginReg/find-password",
  "/userLoginReg/register",
];

router.beforeEach(async (to, from, next) => {
  // 根据路由设置标题
  if (to.meta && to.meta.title) {
    document.title = to.meta.title;
  }
  if (Vue.ls.get(ACCESS_TOKEN)) {
    // 有 token
    if (to.path === loginPath) {
      // 有 token 且路径为登录页面，则重定向到首页
      next({ path: "/" });
    } else {
      var roles = store.getters.roles();
      if (roles.length === 0) {
        // 有 token，获取登录用户的信息
        store
          .dispatch("GetUserInfo")
          .then((res) => {
            let menus;
            if (res.data.menus.length < 1) {
              Vue.prototype.$dialog.notify.error("无菜单权限，请联系管理员", {
                position: "top-right",
                timeout: 2000, // 设置超时时间
              });
              setTimeout(() => {
                store.dispatch("Logout").then(() => {
                  window.location.reload();
                });
              }, 2000);
              return;
              //没有菜单的权限
            } else {
              menus = res.data.menus;
            }
            // 获取动态的路由数据
            store.dispatch("GenerateRoutes", { menus }).then(() => {
              //这里将系统的动态路由添加到系统模块中
              store.getters.addRouters().forEach((elem, index) => {
                router.options.routes.push(elem);
              });
              router.matcher = new VueRouter().matcher;
              router.options.routes.forEach((elem, index) => {
                router.addRoute(elem);
              });

              // 请求带有 redirect 重定向时，登录自动重定向到该地址
              const redirect = decodeURIComponent(
                from.query.redirect || to.path
              );
              if (to.path === redirect) {
                next({ path: redirect });
                // 侵入方法，确保addRoutes已完成，设置replace: true，这样导航将不会留下历史记录
                next({ ...to, replace: true });
              } else {
                // 跳转到目的路由
                next({ path: redirect });
              }
            });
          })
          .catch((err) => {
            store.dispatch("Logout").then(() => {
              next({ path: loginPath });
            });
          });
      } else {
        next();
      }
    }
  } else {
    // 没有 token
    if (whiteList.includes(to.path)) {
      // 在免登录白名单，直接进入
      next();
    } else {
      // 未在白名单内，直接重定向到登录页面
      next({ path: loginPath });
    }
  }
});
